package acessoDados.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;

import acessoDados.dao.ViagemDAO;
import constants.ProjectConstants;

public class ViagemDAOImpl extends BaseDAOImpl implements ViagemDAO {
	
	public  void associaLocal(int idViagem, int idLocal, int ordem) throws SQLException, ClassNotFoundException{
		String query = "INSERT INTO Viagem_Local (idViagem, idLocal, ordem)" + "VALUES (" + idViagem + ", " + idLocal + ", " + ordem + ");";
		executaQueryUpdate(query);
	}
	
	public  void associaTripulante(int idViagem, String loginTripulante) throws SQLException, ClassNotFoundException{
		String query = "INSERT INTO Viagem_Tripulante (idViagem, login)" + "VALUES (" + idViagem + ", '" + loginTripulante + "');";
		executaQueryUpdate(query);
	}

	public  int criaViagem(String diaPartida, String diaChegada, String idAviao, String preco) throws SQLException, ClassNotFoundException {
		String query = "INSERT INTO viagem (diaPartida, diaChegada, idAviao, preco)" + "VALUES (" + diaPartida+ ", " + diaChegada+ ", " + idAviao+ ", " + preco + ");";
		executaQueryUpdate(query);
		return getIdViagem(diaPartida, diaChegada, idAviao, preco);
	}

	public  int getIdViagem(String diaPartida, String diaChegada, String idAviao, String preco) throws SQLException, ClassNotFoundException {
		String query = "SELECT idViagem FROM viagem WHERE diaPartida=" + diaPartida + 
					" AND diaChegada=" + diaChegada + " AND idAviao=" + idAviao + 
					" AND preco=" + preco + ";";
		ResultSet result = executaQuery(query);
		if(result.next())
			return result.getInt("idViagem");
		else
			return 0;
	}

	public  int getNrTotalViagens() throws SQLException, ClassNotFoundException {
		String query = "SELECT COUNT( * ) nrTotal FROM viagem;";
		ResultSet result = executaQuery(query);
		if(result.next())
			return result.getInt("nrTotal");
		else
			return 0;
	}
	
	public  int getNrTotalViagensCanceladas() throws SQLException, ClassNotFoundException {
		String query = "SELECT COUNT( * ) nrTotal FROM viagem WHERE estadoViagem=" + ProjectConstants.CANCELADO+";";
		ResultSet result = executaQuery(query);
		if(result.next())
			return result.getInt("nrTotal");
		else
			return 0;
	}
	
	public  double getPercentagemLotacao() throws SQLException, ClassNotFoundException {
		String query1 = "SELECT SUM(a.lotacao) totalLotacao FROM viagem v, aviao a" +
					" WHERE v.idAviao=a.idAviao" +
					" AND v.estadoViagem=" + ProjectConstants.FECHADO + ";";
		ResultSet result1 = executaQuery(query1);
		
		String query2 = "SELECT COUNT(*) nrLugares" +
					" FROM viagem v, reserva r, lugaraviao la" +
					" WHERE v.idViagem=r.idViagem" +
					" AND r.idReserva=la.idReserva" +
					" AND v.estadoViagem=" + ProjectConstants.FECHADO + ";";
		ResultSet result2 = executaQuery(query2);
		
		if(result1.next() && result2.next())
			if(result1.getDouble("totalLotacao")!=0)
				return result2.getDouble("nrLugares") / result1.getDouble("totalLotacao") * 100;
			else
				return 100;
		else
			return 0;
	}
	

	public  String getPreco(String idViagem) throws SQLException, ClassNotFoundException {
		String query = "SELECT preco FROM viagem WHERE idViagem="+idViagem +";";
		ResultSet s = executaQuery(query);
		if(s.next()){
			System.out.println("Obteve o preco: "+s.getString("preco")+"€");
			return s.getString("preco");
		}
		return "";
	}

	public  void cancelaViagem(String id) throws SQLException, ClassNotFoundException {
		String query = "UPDATE viagem SET estadoViagem=" + ProjectConstants.CANCELADO +
		" WHERE idViagem=" + id + ";";
		executaQueryUpdate(query);
		
		String query2 = "DELETE FROM viagem_local WHERE idViagem=" + id + ";";
		executaQueryUpdate(query2);
		
		String query3 = "DELETE FROM viagem_tripulante WHERE idViagem=" + id + ";";
		executaQueryUpdate(query3);
	}

	public  ResultSet getViagens() throws SQLException, ClassNotFoundException {

 		String query = "SELECT lv.idViagem, group_concat(l.NomeLocal ORDER BY lv.ordem separator ', ') as titulo" +
					" FROM viagem_local lv, local l, viagem v" +
					" WHERE l.idLocal=lv.idLocal AND v.idViagem=lv.idViagem AND v.estadoViagem=" + ProjectConstants.ACTIVO + 
					" GROUP BY lv.idViagem;";
 		return executaQuery(query);
	}

	public  ResultSet getDetalhesViagem(String id) throws SQLException, ClassNotFoundException {
 		String query = "SELECT v.idViagem, vista1.locais, vista2.tripulantes," +
				" v.diaPartida, v.diaChegada, v.preco, a.lotacao, a.idAviao, a.TipoAviao" +
				" FROM viagem v, aviao a," +
				" (" +
				" SELECT v.idViagem, group_concat(l.NomeLocal ORDER BY lv.ordem separator ', ') as locais" +
				" FROM viagem_local lv, local l, viagem v" +
				" WHERE l.idLocal=lv.idLocal AND v.idViagem=lv.idViagem" + 
				" GROUP BY v.idViagem" +
				" ) vista1," +
				" (" +
				" SELECT v.idViagem, group_concat(u.login separator ', ') as tripulantes" +
				" FROM viagem_tripulante lt, utilizador u, viagem v" +
				" WHERE u.login=lt.login AND v.idViagem=lt.idViagem" +
				" GROUP BY v.idViagem" +
				" ) vista2" +
				" WHERE v.idAviao=a.idAviao AND v.idViagem=" + id + 
				" AND vista1.idViagem=v.idViagem" +
				" AND vista2.idViagem=v.idViagem" +
				" GROUP BY v.idViagem;";
		return executaQuery(query);
	}

	public  ResultSet getLocaisViagem(String id) throws SQLException, ClassNotFoundException {
 		String query = "SELECT l.idLocal, l.NomeLocal, l.coordX, l.coordY" +
				" FROM viagem_local vl, local l" +
				" WHERE l.idLocal=vl.idLocal AND vl.idViagem=" + id + 
				" ORDER BY vl.ordem;";
		return executaQuery(query);
	}

	public  ResultSet getTripulantesViagem(String id) throws SQLException, ClassNotFoundException {
 		String query = "SELECT login" +
				" FROM viagem_tripulante" +
				" WHERE idViagem=" + id + ";";
		return executaQuery(query);
	}

	public  void editViagem(int id, String partida, String chegada, String aviao, String preco) throws SQLException, ClassNotFoundException {
		String query = "UPDATE viagem SET diaPartida=" + partida + ", diaChegada=" + chegada + ", idAviao=" + aviao + ", preco=" + preco + " WHERE idViagem=" + id + ";";
		executaQueryUpdate(query);
	}

	public void desassociaLocais(int idViagem) throws SQLException, ClassNotFoundException {
		String query = "DELETE FROM viagem_local WHERE idViagem=" + idViagem + ";";
		executaQueryUpdate(query);
	}

	public void desassociaTripulantes(int idViagem) throws SQLException, ClassNotFoundException {
		String query = "DELETE FROM viagem_tripulante WHERE idViagem=" + idViagem + ";";
		executaQueryUpdate(query);
	}

	public void fechaViagem(String id) throws SQLException, ClassNotFoundException {
		String query = "UPDATE viagem SET estadoViagem=" + ProjectConstants.FECHADO +
		" WHERE idViagem=" + id + ";";

		executaQueryUpdate(query);

	}

	public int getLotacao(String id) throws SQLException, ClassNotFoundException {
		String query = "SELECT a.lotacao" +
		" FROM viagem v, aviao a" +
		" WHERE a.idAviao=v.idAviao AND idViagem=" + id + ";";
		
		ResultSet result = executaQuery(query);
		if(result.next())
			return result.getInt("lotacao");
		
		return 0;
	}

	public  ResultSet getViagem(String id) throws SQLException, ClassNotFoundException {
		String query = "SELECT * FROM viagem WHERE idViagem="+id+";";
		return executaQuery(query);
	}

	public  int getViagensDeAviao(String idAviao, String diaPartida, String diaChegada) throws SQLException, ClassNotFoundException {
		String query = "SELECT COUNT(*) as numViagens" +
				" FROM viagem" +
				" WHERE idAviao=" + idAviao + " AND " +
				"estadoViagem!=" + ProjectConstants.CANCELADO + " AND " +
				"diaPartida<=" + diaChegada + " AND " +
				"diaChegada>=" + diaPartida + ";";
		//so nao vai buscar as viagens que comecam depois de acabar a viagem X, ou que acabam antes de comecar a viagem X
		
		ResultSet result = executaQuery(query);
		if(result.next())
			return result.getInt("numViagens");
		
		return -1;
	}
	
	public  int getViagensDeTripulantes(String loginTripulante, String diaPartida, String diaChegada) throws SQLException, ClassNotFoundException {
		String query = "SELECT COUNT(*) as numViagens" +
				" FROM viagem v, viagem_tripulante vt" +
				" WHERE vt.idViagem=v.idViagem AND vt.login='"+ loginTripulante + "' AND " +
				"v.estadoViagem!=" + ProjectConstants.CANCELADO + " AND " +
				"v.diaPartida<=" + diaChegada + " AND " +
				"v.diaChegada>=" + diaPartida + ";";
		//so nao vai buscar as viagens que comecam depois de acabar a viagem X, ou que acabam antes de comecar a viagem X
		
		ResultSet result = executaQuery(query);
		if(result.next())
			return result.getInt("numViagens");
		
		return -1;
	}

	public  ResultSet getViagensAFechar(int actual) throws SQLException, ClassNotFoundException {
		String query = "SELECT idViagem FROM viagem" +
				" WHERE estadoViagem=" + ProjectConstants.ACTIVO +
				" AND diaPartida=" + (actual+ProjectConstants.DIAS_ANTES_FECHO_VIAGENS) + ";";
		return executaQuery(query);
	}

	public  ResultSet getLugaresReservadosViagem(String idViagem) throws SQLException, ClassNotFoundException {
		String query = "SELECT la.posicao FROM lugaraviao la, reserva r" +
				" WHERE la.idReserva=r.idReserva AND r.idViagem=" + idViagem + ";";
		return executaQuery(query);
	}

}
